其他
Python批量查询ip定位并绘制城市分布图
点击蓝字关注我们
目录
ip地址定位查询接口介绍
批量查询45万个ip地址定位
利用pyecharts绘制城市分布图
ip地址定位查询接口介绍
查询了很多资料,找到了一些ip地址定位查询的接口,基本都是免费的其中像高德地图、腾讯地图以及百度地图等都提供API接口,只需要注册他们的个人开发者账号即可调用。因为我这边一共有45万个ip地址需要进行查询(在去重后也有40万+个),对比了这三家地图的api接口后发现 高德支持一天30万次请求,腾讯地图只支持1万次请求每天,百度地图就更少了低于1万次。所以,我又找到了一家完全免费且不限请求次数的api接口,太平洋网络IP地址查询web接口(地址:http://whois.pconline.com.cn/)太平洋网络IP地址查询接口示例: 1import requests
2import json
3
4url = 'http://whois.pconline.com.cn/ipJson.jsp'
5ip = '61.235.82.163'
6param = {'ip':ip,
7 'json':'true'
8 }
9ree = requests.get(url, params = param)
10re = json.loads(ree.text.replace("\\"," "))
11print(re)
输出结果如下: 1{'ip': '61.235.82.163',
2 'pro': '广东省',
3 'proCode': '440000',
4 'city': '广州市',
5 'cityCode': '440100',
6 'region': '天河区',
7 'regionCode': '440106',
8 'addr': '广东省广州市天河区 蓝色心情网吧',
9 'regionNames': '',
10 'err': ''}
另外,高德地图API接口调用方式如下: 1import requests
2import json
3
4url = 'https://restapi.amap.com/v3/ip?parameters'
5ip = '61.235.82.163'
6param = {'key':'你的key值',
7 'ip':ip,
8 'output':'JSON'
9 }
10ree = requests.get(url, params = param)
11re = json.loads(ree.text.replace("\\"," "))
12print(re)
高德地图API接口还返回了该ip地址所在城市矩形区域范围1{'status': '1',
2 'info': 'OK',
3 'infocode': '10000',
4 'province': '广东省',
5 'city': '广州市',
6 'adcode': '440100',
7 'rectangle': '113.1017375,22.93212254;113.6770499,23.3809537'}
批量查询45万个ip地址定位
我试了一下,循环查询45万个ip地址定位,30分钟才跑完3万个左右。如果需要跑完全部,估计在8小时左右,简直太久了。然后一个朋友和我说,可以试试多线程或多进程。好熟悉的名词,但是我木有用过。。于是,找来官方资料看了下,原来如此啊。于是,我便去尝试了下。果然,4核8 cpu都爆满了,最终45万个ip地址定位结果只用了1小时40余分钟。静默状态下cpu使用情况多进程下cpu使用情况
1def Get_data(num,data):#获取ip地址定位
2 li = []
3
4 datax = data.iloc[(num-1)*60000:60000*num] #因为一共45万左右数据,按照6万每份进行分割
5 n = len(datax.index)
6
7 for _i in range(n):
8 ip = datax['ip'].iloc[_i]
9 param = {'ip':ip,
10 'json':'true'
11 }
12 try:
13 ree = requests.get(url, params = param)
14 re = json.loads(ree.text.replace("\\"," "))
15 logging.info(f"已经存储{_i+1}个ip及所在地")
16 li.append(re)
17 except json.decoder.JSONDecodeError:
18 logging.info(" param['ip']")
19 continue
20 return li
因为机器是4核8 cpu,这是为啥选择了8份的原因,然后调用进程池…多进程的标准库import multiprocessing
1def main(page,data):#数据导出
2 logging.info('正在获取数据')
3 Li = Get_data(page,data)
4 logging.info('正在导出数据')
5 df = pd.DataFrame(Li)
6 e = r'E:\python\数据处理'
7 path = f'{e}\{page}.xlsx'
8 df.to_excel(path)
9 logging.info('数据计算完成!')
10
11if __name__ == '__main__':
12 logging.info('正在读取原始数据')
13 data = pd.read_excel(r'E:\python\数据处理\每日新增用户.xlsx')
14 logging.info('原始数据读取完成')
15 pool = multiprocessing.Pool()
16 pages = range(1,9)
17 pool.map(partial(main,data=data),pages)
18 pool.close()
19 pool.join()
用multiprocess中的Pool起进程池,进程池中开启的个数:默认是cpu个数map:可以拿到返回值的可迭代对象,循环就可以获取返回值了这里除了map也用到了partial方法,因为main()需要传递2个参数,所以先用functools.partial将固定的参数值和main()进行绑定,然后再用map进行循环传参数page同时有多个任务在执行:利用pyecharts绘制城市分布图
采用pyecharts的map方法,传入城市及城市对应的数值,即可完成绘制 1import pandas as pd
2from pyecharts import options as opts
3from pyecharts.charts import Map
4
5df = df[['pro','city','ip']]
6df = df.dropna()
7data = pd.pivot_table(df,values='ip',index='city',aggfunc='count').reset_index()
8data['city']=data['city'].apply(lambda x:x.replace("省",'').replace("市",''))
9
10
11c = (
12 Map()
13 .add("注册玩家分布", [list(z) for z in zip(data['city'], data['ip'])], "china-cities",label_opts=opts.LabelOpts(is_show=False))
14 .set_global_opts(
15 title_opts=opts.TitleOpts(title="玩家分布"),
16 visualmap_opts=opts.VisualMapOpts(max_=5000),
17 )
18)
19c.width = '1200px'
20c.height = '900px'
21c.render('玩家城市分布.html')
扫描二维码
关注我们
微信号 :AlphaGame